home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / tcclib.exe / SAYFA.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-07-18  |  1.3 KB  |  59 lines

  1. unsigned char far *CurrentPos( void );
  2. unsigned char far *ScrPtr( int x, int y );
  3. void RestoreCurPos( unsigned char far *s );
  4. void ScrollUp( int x, int y, int xx, int yy, int n );
  5. void Beep( void );
  6.  
  7. #define VIDMODE   *(unsigned char far *) 0x00449lu
  8. #define MONOSEG  0xb0000000L
  9. #define COLOR 0xb8000000L
  10. #define VIDSEG (unsigned char far *)((7 == VIDMODE) ? MONOSEG : COLOR )
  11.  
  12. #define BELL 7
  13. #define TAB  9
  14.  
  15. #include <stdio.h>
  16.  
  17. void SayFA( char attrib ,char *fmt, ... )
  18. {
  19.     register unsigned char far *scptr = CurrentPos();
  20.     unsigned char far *scend = ScrPtr( 80, 25 );
  21.     char s[240];
  22.     register char *cp = s;
  23.     va_list argptr;
  24.  
  25.     va_start( argptr, format );
  26.     vsprintf( s, fmt, argptr );
  27.     va_end( argptr );
  28.  
  29.     while (*cp) {
  30.         switch( *cp ) {
  31.             case '\n':
  32.                 scptr = (unsigned char far *) ((long) scptr + (long) 160 );
  33.             case '\r':
  34.                 scptr = (unsigned char far *)
  35.                     ( ( ( (long) scptr - (long) VIDSEG ) /
  36.                           (long) 160 ) * (long) 160 + (long) VIDSEG );
  37.                 cp++;
  38.                 break;
  39.             case BELL:
  40.                 Beep();
  41.                 cp++;
  42.                 break;
  43.             case TAB:
  44.                 scptr = (unsigned char far *) ( (long) scptr / 16 * 16 );
  45.                 cp++;
  46.                 break;
  47.             default:
  48.                 *scptr++ = *cp++;
  49.                 *scptr++ = attrib;
  50.                 break;
  51.         }
  52.         if ( scptr > scend ) {
  53.             ScrollUp( 1, 1, 80, 25, 1 );
  54.             scptr -= 160;
  55.         }
  56.     }
  57.     RestoreCurPos( scptr );
  58. }
  59.